home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyListWindowHeaders.p < prev    next >
Encoding:
Text File  |  1997-03-18  |  8.2 KB  |  356 lines  |  [TEXT/CWIE]

  1. unit MyListWindowHeaders;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types, Quickdraw, Lists, QuickdrawText, Events, 
  7.          MyListWindow;
  8.  
  9.     const
  10.         columns_max = 7;
  11.         columns1 = columns_max + 1;
  12.  
  13.     type
  14.         OffsetsArray = array[1..columns1] of integer;
  15.         StringsArray = array[1..columns_max] of Str255;
  16.  
  17.     type
  18.         ListWindowHeadersObject = object(ListWindowObject)
  19.                 columns: integer;
  20.                 headers_strh_id: integer;
  21.                 sort_column: integer;
  22.                 off: OffsetsArray;
  23.                 gap, baseoff, headeroff: integer;
  24.                 aligns: array[boolean] of string[columns_max];
  25.                 do_header_clicks: boolean;
  26.                 procedure CreateList (font, size: integer; listitem: integer; ldefID: integer; hscroll: boolean);
  27.                 override;
  28.                 procedure LDEF (message: integer; select: boolean; var r: Rect; c: Cell; dataoffset, datalen: integer);
  29.                 override;
  30.                 procedure DrawHeader (r: Rect);
  31.                 override;
  32.                 procedure DoHeaderClick (r: Rect; where: Point; const er: EventRecord);
  33.                 override;
  34.                 procedure GetHeaderStrings (var ss: StringsArray);
  35.                 procedure Strings (index: integer; var ss: StringsArray);
  36.                 procedure GetStringRect (const r: Rect; col: integer; var ss: StringsArray; var ther: Rect; header: boolean);
  37.                 procedure DrawStrings (r: Rect; var ss: StringsArray; select, header: boolean; hilite: integer);
  38.                 procedure DrawEntry( index: integer; select: boolean; var r: Rect );
  39.                 procedure MaxStrings (var maxs: OffsetsArray; var ss: StringsArray);
  40.                 procedure GetMaxs (var maxs: OffsetsArray);
  41.                 procedure SetOffs;
  42.                 procedure GetResourceStrings (id: integer; var ss: StringsArray);
  43.  
  44.                 function EditMenuEnabled: boolean;
  45.                 override;
  46.                 procedure SetEditMenuItem (item: integer);
  47.                 override;
  48.                 procedure DoEditMenu (item: integer);
  49.                 override;
  50.                 function CopySelectionToHandle: Handle;
  51.             end;
  52.  
  53. implementation
  54.  
  55.     uses
  56.         TextUtils, Scrap, Events, Memory, 
  57.         MyTypes, MyUtils, MyMenus, MyListManager, MyMemory;
  58.  
  59.     procedure ListWindowHeadersObject.GetResourceStrings (id: integer; var ss: StringsArray);
  60.         var
  61.             i: integer;
  62.     begin
  63.         for i := 1 to columns do begin
  64.             GetIndString(ss[i], id, i);
  65.         end;
  66.     end;
  67.  
  68.     procedure ListWindowHeadersObject.GetHeaderStrings (var ss: StringsArray);
  69.     begin
  70.         GetResourceStrings( headers_strh_id, ss );
  71.     end;
  72.  
  73.     procedure ListWindowHeadersObject.Strings (index: integer; var ss: StringsArray);
  74.         var
  75.             i: integer;
  76.     begin
  77. {$unused(index)}
  78.         for i := 1 to columns do begin
  79.             ss[i] := '???';
  80.         end;
  81.     end;
  82.  
  83.     procedure ListWindowHeadersObject.MaxStrings (var maxs: OffsetsArray; var ss: StringsArray);
  84.         var
  85.             i, sw: integer;
  86.     begin
  87.         for i := 1 to columns do begin
  88.             sw := StringWidth(ss[i]);
  89.             if sw > maxs[i] then begin
  90.                 maxs[i] := sw;
  91.             end;
  92.         end;
  93.     end;
  94.  
  95.     procedure ListWindowHeadersObject.GetMaxs (var maxs: OffsetsArray);
  96.         var
  97.             i: integer;
  98.             ss: StringsArray;
  99.     begin
  100.         SetPort(window);
  101.         for i := 1 to columns do begin
  102.             maxs[i] := 0;
  103.         end;
  104.         GetHeaderStrings(ss);
  105.         MaxStrings(maxs, ss);
  106.     end;
  107.  
  108.     procedure ListWindowHeadersObject.SetOffs;
  109.         var
  110.             i: integer;
  111.             maxs: OffsetsArray;
  112.     begin
  113.         GetMaxs(maxs);
  114.         off[1] := gap;
  115.         for i := 1 to columns do begin
  116.             off[i + 1] := off[i] + maxs[i] + gap;
  117.         end;
  118.         SetListWidth(off[columns + 1]);
  119.     end;
  120.  
  121.     procedure ListWindowHeadersObject.GetStringRect (const r: Rect; col: integer; var ss: StringsArray; var ther: Rect; header: boolean);
  122.         var
  123.             sw: integer;
  124.     begin
  125.         sw := StringWidth(ss[col]);
  126.         ther.top := r.top;
  127.         ther.bottom := r.bottom;
  128.         if header then begin
  129.             ther.bottom := ther.bottom - 3;
  130.         end;
  131.         case aligns[header][col] of
  132.             'L':  begin
  133.                 ther.left := r.left - list_offset + off[col];
  134.             end;
  135.             'R':  begin
  136.                 ther.left := r.left - list_offset + off[col + 1] - sw - gap;
  137.             end;
  138.             'C':  begin
  139.                 ther.left := r.left - list_offset + (off[col] + off[col + 1] - sw - gap) div 2;
  140.             end;
  141.         end;
  142.         ther.right := ther.left + sw;
  143.     end;
  144.  
  145.     procedure ListWindowHeadersObject.    DrawStrings (r: Rect; var ss: StringsArray; select, header: boolean; hilite: integer);
  146.         var
  147.             ps: PenState;
  148.             i: integer;
  149.             ir: Rect;
  150.     begin
  151.         SetPort(window);
  152.         GetPenState(ps);
  153.         PenNormal;
  154.         EraseRect(r);
  155.  
  156.         for i := 1 to columns do begin
  157.             GetStringRect(r, i, ss, ir, header);
  158.             if header then begin
  159.                 MoveTo(ir.left, ir.bottom - headeroff);
  160.             end else begin
  161.                 MoveTo(ir.left, ir.bottom - baseoff);
  162.             end;
  163.             if header and (hilite = i) then begin
  164.                 TextFace([underline]);
  165.                 DrawString(ss[i]);
  166.                 TextFace([]);
  167.             end else begin
  168.                 DrawString(ss[i]);
  169.             end;
  170.         end;
  171.  
  172.         if select then begin
  173.             HiliteInvertRect(r);
  174.         end;
  175.  
  176.         SetPenState(ps);
  177.     end;
  178.  
  179.     procedure ListWindowHeadersObject.DrawHeader (r: Rect);
  180.         var
  181.             ss: StringsArray;
  182.     begin
  183.         GetHeaderStrings(ss);
  184.         DrawStrings(r, ss, false, true, sort_column);
  185.         MoveTo(r.left,r.bottom-2);
  186.         LineTo(r.right,r.bottom-2);
  187.     end;
  188.  
  189.     procedure ListWindowHeadersObject.DoHeaderClick (r: Rect; where: Point; const er: EventRecord);
  190.         var
  191.             i, j: integer;
  192.             ir: Rect;
  193.             ss: StringsArray;
  194.             on, newon: boolean;
  195.     begin
  196. {$unused(er)}
  197.         if do_header_clicks then begin
  198.             j := -1;
  199.             GetHeaderStrings(ss);
  200.             for i := 1 to columns do begin
  201.                 GetStringRect(r, i, ss, ir, true);
  202.                 if PtInRect(where, ir) then begin
  203.                     j := i;
  204.                     leave;
  205.                 end;
  206.             end;
  207.             if (j > 0) & (j <> sort_column) then begin
  208.                 InsetRect(ir, -1, 1);
  209.                 InvertRect(ir);
  210.                 on := true;
  211.                 while StillDown do begin
  212.                     GetMouse(where);
  213.                     newon := PtInRect(where, ir);
  214.                     if newon <> on then begin
  215.                         InvertRect(ir);
  216.                         on := newon;
  217.                     end;
  218.                 end;
  219.                 if on then begin
  220.                     InvertRect(ir);
  221.                     sort_column := j;
  222.                     DrawStrings(r, ss, false, true, sort_column);
  223.                 end;
  224.             end;
  225.         end;
  226.     end;
  227.  
  228.     procedure ListWindowHeadersObject.DrawEntry( index: integer; select: boolean; var r: Rect );
  229.         var
  230.             ss: StringsArray;
  231.     begin
  232.         Strings( index, ss );
  233.         DrawStrings( r, ss, select, false, 0 );
  234.     end;
  235.     
  236.     function ListWindowHeadersObject.EditMenuEnabled: boolean;
  237.     begin
  238.         EditMenuEnabled := LCount( list ) > 0;
  239.     end;
  240.  
  241.     procedure ListWindowHeadersObject.SetEditMenuItem (item: integer);
  242.     begin
  243.         case item of
  244.             EMcopy:  begin
  245.                 SetIDItemEnable(M_Edit, item, IsSelection);
  246.             end;
  247.             EMselectall:  begin
  248.                 SetIDItemEnable(M_Edit, item, (LCount( list ) > 0) & not LAllSelected( list ) );
  249.             end;
  250.             otherwise begin
  251.                 SetIDItemEnable(M_Edit, item, false);
  252.             end;
  253.         end;
  254.     end;
  255.  
  256.     function ListWindowHeadersObject.CopySelectionToHandle: Handle;
  257.         var
  258.             data: Handle;
  259.             c: Cell;
  260.             count: integer;
  261.             err, junk: OSErr;
  262.             ss: StringsArray;
  263.             size: longint;
  264.             i: integer;
  265.     begin
  266.         c.h := 0;
  267.         c.v := 0;
  268.         junk := MNewHandle( data, 0 );
  269.         count := 0;
  270.         while LGetSelect(true, c, list) do begin
  271.             Strings( c.v+1, ss );
  272.             size := GetHandleSize( data );
  273.             for i := 1 to columns do begin
  274.                 if i < columns then begin
  275.                     ss[i] := ss[i] + tab;
  276.                 end else begin
  277.                     ss[i] := ss[i] + cr;
  278.                 end;
  279.                 err := PtrAndHand(@ss[i][1], data, length(ss[i]));
  280.                 if err <> noErr then begin
  281.                     leave;
  282.                 end;
  283.             end;
  284.             if err <> noErr then begin
  285.                 SetHandleSize( data, size );
  286.             end;
  287.             c.v := c.v + 1;
  288.         end;
  289.         CopySelectionToHandle := data;
  290.     end;
  291.  
  292.     procedure ListWindowHeadersObject.DoEditMenu (item: integer);
  293.         var
  294.             loe: longint;
  295.             data: Handle;
  296.     begin
  297.         case item of
  298.             EMcopy:  begin
  299.                 data := CopySelectionToHandle;
  300.                 loe := ZeroScrap;
  301.                 HLock( data );
  302.                 loe := PutScrap( GetHandleSize( data ), 'TEXT', data^ );
  303.                 MDisposeHandle( data );
  304.             end;
  305.             EMselectall:  begin
  306.                 LSetAllSelections( list, true );
  307.             end;
  308.             otherwise begin
  309.                 { do nothing }
  310.             end;
  311.         end;
  312.     end;
  313.  
  314.     procedure ListWindowHeadersObject.LDEF (message: integer; select: boolean; var r: Rect; c: Cell; dataoffset, datalen: integer);
  315.         procedure LDClose;
  316.         begin
  317.         end;
  318.  
  319.         procedure LDDraw;
  320.         begin
  321.             DrawEntry( c.v + 1, select, r );
  322. {            if datalen = 0 then begin
  323.             end;}
  324.         end;
  325.  
  326.     begin
  327. {$unused(dataoffset, datalen)}
  328.         case message of
  329.             lInitMsg: 
  330.                 ;
  331.             lDrawMsg: 
  332.                 LDDraw;
  333.             lHiliteMsg: 
  334.                 LDDraw;
  335.             lCloseMsg: 
  336.                 LDClose;
  337.         end;
  338.     end;
  339.  
  340.     procedure ListWindowHeadersObject.CreateList (font, size: integer; listitem: integer; ldefID: integer; hscroll: boolean);
  341.         var
  342.             fi: FontInfo;
  343.     begin
  344.         inherited CreateList(font, size, listitem, ldefID, hscroll);
  345.         sort_column := -1;
  346.         gap := 5;
  347.         GetFontInfo(fi);
  348.         baseoff := fi.leading + fi.descent;
  349.         headeroff := baseoff;
  350.         header_height := fi.ascent + fi.leading + fi.descent + 2;
  351.         do_header_clicks := true;
  352.         aligns[false] :='LLLLLLL';
  353.         aligns[true] :='LLLLLLL';
  354.     end;
  355.     
  356. end.